package com.another.common.utils.common;

import com.another.common.entity.TUser;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import java.io.UnsupportedEncodingException;
import java.util.UUID;

/**
 * Created by Another on 2017/8/15.
 */
public class TokenUtil {

    static Logger logger=LoggerFactory.getLogger(TokenUtil.class);

//    @Autowired
//    RedisRepository redisRepository;

    private final String str="Token_";

    public static String[] chars = new String[]{"a", "b", "c", "d", "e", "f",
            "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s",
            "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5",
            "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I",
            "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V",
            "W", "X", "Y", "Z"};

    /**
     * 生成一个uuid
     * @return
     */
    public static String generateShortUuid() {
        StringBuffer shortBuffer = new StringBuffer();
        String uuid = UUID.randomUUID().toString().replace("-", "");
        for (int i = 0; i < 8; i++) {
            String str = uuid.substring(i * 4, i * 4 + 4);
            int x = Integer.parseInt(str, 16);
            shortBuffer.append(chars[x % 0x3E]);
        }
        return shortBuffer.toString();

    }

    // 加密
    public static String getBase64(String str) {
        byte[] b = null;
        String s = null;
        try {
            b = str.getBytes("utf-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        if (b != null) {
            s = new BASE64Encoder().encode(b);
        }
        return s;
    }

    // 解密
    public static String getFromBase64(String s) {
        byte[] b = null;
        String result = null;
        if (s != null) {
            BASE64Decoder decoder = new BASE64Decoder();
            try {
                b = decoder.decodeBuffer(s);
                result = new String(b, "utf-8");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return result;
    }

    /**
     * 生成一个加密的token
     * @param uid
     * @return
     */
    public static String uuidFactory(String uid){
        String demo=generateShortUuid()+"_"+uid;
        String token="Token_"+getBase64(demo);
        return token;
    }


    public String tokenFactory(TUser tUser){
        String token=uuidFactory(tUser.getRequestUserId());       //生成token
        /*tUser.setCreateTokenTime(Calendar.getInstance().getTime());
        tUser.setToken(token);*/
        /*String s=JSON.toJSONString(user);
        Object j=JSON.toJSON(user);
        PageBclpUser pageBclpUser=JSON.toJavaObject(JSON.parseObject(s),PageBclpUser.class);*/
        //redisRepository.set(str+user.getSource()+user.getId(),user,2,TimeUnit.HOURS);   //以userid为键存入redis
        return token;
    }

    /**
     * 移除token
     * @param userId
     */
//    public void tokenDel(String userId,String source){
//        redisRepository.del(str +source+ userId);
//    }

//    /**
//     * 解析token
//     * @param token
//     * @return
//     */
//    public static String tokenCheck(String token){
//        try {
//            String str = token.replaceAll("Token_", "");
//            String jiemi = getFromBase64(str);
//            int index = jiemi.lastIndexOf("_");
//            String uid = jiemi.substring(index + 1, jiemi.length());
//            return uid;
//        }catch (Exception e){
//            logger.info("【系统异常】：token解析失败",e);
//            throw new MyException(ResultEnum.ERROR.getCode(),"请求失败！");
//        }
//    }

//    /**
//     * 验证token
//     * @param httpServletRequest
//     * @return
//     */
//    public  String accessToken(HttpServletRequest httpServletRequest){
//        Map<String,String> map=getHeadersInfo(httpServletRequest);
//        String token=map.get("token");     //获取token
//        String source=map.get("source");     //获取客户端源
//        if(null==token){
//            logger.info("【系统异常】：未获取到Token！");
//            logger.info(httpServletRequest.getRequestURL());
//            throw new MyException(ResultEnum.NO_AUTHORITY);
//        }
//
//        String uid=tokenCheck(token);      //验证token
//
////        Object o=redisUtil.getRedisTemplate().opsForValue().get(token);
//        BclpUserLogin user= (BclpUserLogin) redisRepository.get(str+source+uid);
////        Object o=redisRepository.get(str+uid);
//
////        Object o=redisUtil.getRedisTemplate().opsForValue().get(str+uid);
//        if(null==user){
//            throw new MyException(102,"您的登录已失效，请重新登录!");
//        }
//
//        if (!EmptyUtil.isEmpty(user.getResultCode()) && user.getResultCode() != ResultEnum.SUCCESS.getCode()) {
//            throw new MyException(user.getResultCode(),user.getErrorMsg());
//        }
//
////        String str= (String)o;   //redis根据token获取值
////        PageBclpUser user= JSON.toJavaObject(JSON.parseObject(str),PageBclpUser.class);
//
//        if(!user.getToken().equals(token)){
//            logger.info("【系统异常】：Token异常！");
//            throw new MyException(102,"异地登录");
//        }
//
//        if (null==user||user.getId()==null||user.getId()==""){
//            logger.info("【系统异常】：Token异常！");
//            throw new MyException(102,"登录超时！");
//        }
//        if(DateUtil.getDatePoor(Calendar.getInstance().getTime(),user.getCreateToken())>=12){       //存在时间超过12个小时
//            redisRepository.del("token");
//            logger.info("【系统异常】：Token异常！");
//            throw new MyException(102,"登录超时！");
//        }
////        redisUtil.getRedisTemplate().expire(str+uid,user,2, TimeUnit.HOURS);     //设置多久之后过期
//        String url = httpServletRequest.getRequestURL().toString();
//        String restfulApi = url.substring(url.indexOf("/bclp") + 5, url.length()).toString();
//        if (!"/message/getMessageCount".equals(restfulApi)){
//            redisRepository.expire(str+source+uid,2,TimeUnit.HOURS);
//        }
//        return uid;
//    }



//    public Map<String, String> getHeadersInfo(HttpServletRequest request) {
//        Map<String, String> map = new HashMap<String, String>();
//        Enumeration headerNames = request.getHeaderNames();
//        while (headerNames.hasMoreElements()) {
//            String key = (String) headerNames.nextElement();
//            String value = request.getHeader(key);
//            map.put(key, value);
//        }
//        return map;
//    }

//    public void reset(String userId,Integer code,String msg){
//        BclpUserLogin userWeb = (BclpUserLogin) redisRepository.get(str+ Enums.AccessSourceEnum.WEB.getCode()+userId);
//        if (!EmptyUtil.isEmpty(userWeb)) {
//            userWeb.setResultCode(code);
//            userWeb.setErrorMsg(msg);
//            redisRepository.set(str+userWeb.getSource()+userWeb.getId(),userWeb,2, TimeUnit.HOURS);
//        }
//        BclpUserLogin userAndroidCarrier = (BclpUserLogin) redisRepository.get(str+Enums.AccessSourceEnum.ANDROID_CARRIER+userId);
//        if (!EmptyUtil.isEmpty(userAndroidCarrier)) {
//            userAndroidCarrier.setResultCode(code);
//            userAndroidCarrier.setErrorMsg(msg);
//            redisRepository.set(str+userAndroidCarrier.getSource()+userAndroidCarrier.getId(),userAndroidCarrier,2, TimeUnit.HOURS);
//        }
//        BclpUserLogin userAndroidDriver = (BclpUserLogin) redisRepository.get(str+Enums.AccessSourceEnum.ANDROID_DRIVER+userId);
//        if (!EmptyUtil.isEmpty(userAndroidDriver)) {
//            userAndroidDriver.setResultCode(code);
//            userAndroidDriver.setErrorMsg(msg);
//            redisRepository.set(str+userAndroidDriver.getSource()+userAndroidDriver.getId(),userAndroidDriver,2, TimeUnit.HOURS);
//        }
//        BclpUserLogin userIosCarrier = (BclpUserLogin) redisRepository.get(str+Enums.AccessSourceEnum.IOS_CARRIER+userId);
//        if (!EmptyUtil.isEmpty(userIosCarrier)) {
//            userIosCarrier.setResultCode(code);
//            userIosCarrier.setErrorMsg(msg);
//            redisRepository.set(str+userIosCarrier.getSource()+userIosCarrier.getId(),userIosCarrier,2, TimeUnit.HOURS);
//        }
//        BclpUserLogin userIosDriver = (BclpUserLogin) redisRepository.get(str+Enums.AccessSourceEnum.IOS_DRIVER+userId);
//        if (!EmptyUtil.isEmpty(userIosDriver)) {
//            userIosDriver.setResultCode(code);
//            userIosDriver.setErrorMsg(msg);
//            redisRepository.set(str+userIosDriver.getSource()+userIosDriver.getId(),userIosDriver,2, TimeUnit.HOURS);
//        }
//    }

    /**
     * 根据token获取userCode
     * @param
     * @return
     */
//    public  String getUserCodeByToken(String token,String source){
//        String userCode;
//        try {
//            String strs = token.replaceAll("Token_", "");
//            String jiemi = getFromBase64(strs);
//            int index = jiemi.lastIndexOf("_");
//            String uid = jiemi.substring(index + 1, jiemi.length());
//
//            logger.info(str+source+uid);
//            BclpUserLogin user= (BclpUserLogin) redisRepository.get(str+source+uid);
//            userCode = user.getUserCode();
//            logger.info("userCode:"+userCode);
//            return userCode;
//
//        }catch (Exception e){
//            logger.info("获取用户代码失败");
//            return null;
//        }
//    }
}
